﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApplication1
{
    /// <summary>
    /// 定义一个委托
    /// </summary>
    /// <param name="p_out"></param>
    public delegate void doSome(string p_out);

    /// <summary>
    /// 定义一个接口
    /// </summary>
    interface Interface1Class
    {
        /// <summary>
        /// 声明一个接口方法，带返回值
        /// </summary>
        /// <returns></returns>
        int NowInt();

        /// <summary>
        /// 声明一个接口方法，不带返回值
        /// </summary>
        void AddNow();
    }

    /// <summary>
    /// 定义一个接口，该接口继承自Interface1Class
    /// </summary>
    interface Interface2Class : Interface1Class
    {
        /// <summary>
        /// 本方法和基接口中的AddNow签名是不一样的
        /// </summary>
        /// <param name="p_num"></param>
        void AddNow(int p_num);
    }

    /// <summary>
    /// 定义一个接口
    /// </summary>
    interface Interface3Class
    {
        /// <summary>
        /// 声明一个接口方法，带返回值
        /// </summary>
        /// <returns></returns>
        string NowString();

        /// <summary>
        /// 声明一个接口方法，不带返回值
        /// </summary>
        void AddString();
    }

    /// <summary>
    /// 定义一个接口，该接口继承自Interface3Class
    /// </summary>
    interface Interface4Class : Interface3Class
    {
        /// <summary>
        /// 可以覆盖基接口的方法定义，虽然没有实际意义
        /// </summary>
        new void AddString();
    }

    /// <summary>
    /// 定义一个接口，该接口继承自Interface2Class和Interface4Class
    /// </summary>
    interface Interface5Class : Interface2Class, Interface4Class
    {
        /// <summary>
        /// 可以在接口中定义属性成员(但不含实际实现)
        /// </summary>
        string FinialString
        {
            get;
            set;
        }

        /// <summary>
        /// 可以在接口中定义索引成员
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        string this[int index]
        {
            get;
        }

        /// <summary>
        /// 新加的一个接口方法
        /// </summary>
        void WriteAll();

        /// <summary>
        /// 可以在接口中定义事件成员
        /// </summary>
        event doSome OnSay;
    }

    /// <summary>
    /// 类实现接口Interface5Class
    /// </summary>
    public class InterfaceClass : Interface5Class
    {
        private int s_now_int = 0;

        private string s_now_string = "";

        /// <summary>
        /// 实现接口中的NowInt
        /// </summary>
        /// <returns></returns>
        public int NowInt()
        {
            return this.s_now_int;
        }

        /// <summary>
        /// 实现接口中的AddNow
        /// </summary>
        public void AddNow()
        {
            this.s_now_int += 1;
        }

        /// <summary>
        /// 实现接口中的AddNow(int)
        /// </summary>
        /// <param name="p_one"></param>
        public void AddNow(int p_one)
        {
            this.s_now_int += p_one;
        }

        /// <summary>
        /// 实现接口中的NowString
        /// </summary>
        /// <returns></returns>
        public string NowString()
        {
            return this.s_now_string;
        }

        /// <summary>
        /// 实现接口中的AddString
        /// </summary>
        public void AddString()
        {
            this.s_now_string += " 这是新添加的字符串";
            this.say("添加了新的字符串~");
        }

        /// <summary>
        /// 实现接口中的FinialString属性
        /// </summary>
        public string FinialString
        {
            get
            {
                return "最终字符串：" + this.s_now_string;
            }
            set
            {
                this.s_now_string = "最终字符串：" + value;
                this.say("设置了FinialString~");
            }
        }

        /// <summary>
        /// 实现接口中的索引器
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public string this[int index]
        {
            get
            {
                if (index == 0)
                {
                    return this.s_now_string;
                }
                else
                {
                    return "你是找不到这字符串的啦！~";
                }
            }
        }

        /// <summary>
        /// 实现接口中的WriteAll
        /// </summary>
        public void WriteAll()
        {
            Console.WriteLine("当前的数字是：{0}", this.s_now_int.ToString());
            Console.WriteLine("当前的字符串：{0}", this.s_now_string);
            this.say("我说话啦！~");
        }

        /// <summary>
        /// 实现接口的事件
        /// </summary>
        public event doSome OnSay;

        /// <summary>
        /// 对事件的处理
        /// </summary>
        /// <param name="p_out"></param>
        private void say(string p_out)
        {
            if (this.OnSay != null)
            {
                this.OnSay(p_out);
            }
        }
    }

    /// <summary>
    /// InterClass类实现了接口Interface1Class和Interface3Class，可以看作是多继承
    /// </summary>
    public class InterClass : Interface1Class, Interface3Class
    {
        /// <summary>
        /// 实现接口Interface1Class的NowInt
        /// </summary>
        /// <returns></returns>
        public int NowInt()
        {
            return 10;
        }

        /// <summary>
        /// 实现接口Interface1Class中的AddNow
        /// </summary>
        public void AddNow()
        {
            Console.WriteLine("好累啊");
        }

        /// <summary>
        /// 实现接口Interface3Class的NowString
        /// </summary>
        /// <returns></returns>
        public string NowString()
        {
            return "哈哈哈";
        }

        /// <summary>
        /// 实现接口Interface3Class的AddString
        /// </summary>
        public void AddString()
        {
            Console.WriteLine("好爽啊");
        }
    }
}
